﻿#region License

// Copyright (c) 2011, Matt Holmes
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification, are permitted provided 
// that the following conditions are met:
// 
// * Redistributions of source code must retain the above copyright notice, this list of conditions and the 
//   following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
//   the following disclaimer in the documentation and/or other materials provided with the distribution.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
// OF THE POSSIBILITY OF SUCH DAMAGE.

#endregion

using System;
using Microsoft.Practices.Prism.Events;
using Microsoft.Practices.Prism.ViewModel;
using SkyrimTweaker.Common;

namespace SkyrimTweaker {
	public interface IUpdateProgressView {
		void Close ();
	}

	public interface IUpdateProgressViewModel {
		int DownloadPercentage { get; }
		string SizeText { get; }
		IUpdateProgressView View { get; set; }
	}

	public class UpdateProgressViewModel : NotificationObject, IUpdateProgressViewModel {
		#region Fields

		private long _currentKb;
		private int _downloadPercentage;
		private long _totalKb;

		#endregion

		#region Constructors

		public UpdateProgressViewModel (IEventAggregator eventAggregator) {
			eventAggregator.GetEvent<UpdateProgressEvent> ().Subscribe (e => {
				DownloadPercentage = e.ProgressPercentage;
				_totalKb = e.TotalBytesToReceive / 1024;
				_currentKb = e.BytesReceived / 1024;
				RaisePropertyChanged (() => SizeText);
			});

			eventAggregator.GetEvent<UpdateCompleteEvent> ().Subscribe (s => View.Close (), ThreadOption.UIThread);
		}

		#endregion

		#region IUpdateProgressViewModel Members

		public IUpdateProgressView View { get; set; }

		public int DownloadPercentage {
			get { return _downloadPercentage; }
			set {
				_downloadPercentage = value;
				RaisePropertyChanged (() => DownloadPercentage);
			}
		}

		public string SizeText {
			get { return String.Format ("{0} / {1}kb", _currentKb, _totalKb); }
		}

		#endregion
	}
}
